gusucode.com > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM源码程序 > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM\stprtool\linear\fisher\pfish2d.m

    function [handler]=pfish2d(alphas,handler)
% PFISH2D plots boundaries of Fisher's classifier in 2D.
%  [handler]=pfish2d(alphas,handler)
%
% PFISH2D plots boundaries of the Fisher's classifier in 2D.
%   See fishdemo for the example of use.
%
% Input:
%  alphas [2xK] contains K vectors determining the classifer (cones).
%  handler [...] contains handlers of used graphics objects.
%
% Output:
%  handler [...] handlers to used graphics objects.
%
% See also FISHDEMO, FISHERP, FISHERK.
%

% Statistical Pattern Recognition Toolbox, Vojtech Franc, Vaclav Hlavac
% (c) Czech Technical University Prague, http://cmp.felk.cvut.cz
% Written Vojtech Franc (diploma thesis) 12.10.1999, 23.12.1999
% Modifications
% 26-June-2001, V. Franc, comments repared.
% 24. 6.00 V. Hlavac, comments polished.

alphas=alphas';

% number of lines
anum=size(alphas,1);

%% Computes angles of the vectors alphas %%
angles=[];
for i=1:anum,
   normal=norm(alphas(i,:));             % norm. vector alpha
   if normal~=0,
      alpha=alphas(i,:)/normal;
      angle=acos(alpha(1));
      if alphas(i,2) < 0,
         angle=2*pi-angle;
      end
   else
      angle=0;
   end
   angles=[angles;angle];
end

%% Sort the alphas according to the angle %%
[angles,index]=sort(angles);
sortalphas=alphas;
for i=1:anum,
   if index(i) ~= i,
      sortalphas(i,:)=alphas(index(i),:);
   end
end
alphas=sortalphas;


if nargin == 1,
   % first tlotting, create lines
   % Get current axes
   window=axis;
   handler=zeros(anum*2,1);
   handler=[handler;gca];
   alpha0=alphas(anum,:);
   j=1;
   for i=1:anum,
      % draw border among the two vectors alpha
      alpha1=alphas(i,:);
      alpha=alpha0-alpha1;
      alpha=[-alpha(2) alpha(1)];
      [x,y]=cliplin2(alpha,window);
      handler(j)=line([0 x],[0 y],...
         'Color','k',...
         'EraseMode','XOR',...
         'LineStyle','--');
      j=j+1;

      % draw vector alpha
      [x,y]=cliplin2(alphas(i,:),window);
        %         'Color',XCOLORS(mod(index(i)-1,size(XCOLORS,2))+1),...
      handler(j)=line([0 x],[0 y],...
         'Color',color(index(i)),...
         'LineWidth',2,...
         'Marker','none',...
         'EraseMode','XOR');
      j=j+1;

      % If the alpha1 is equal to zero then don`t appear her.
      if sum(alpha1) == 0,
         set([handler(j-1) handler(j-2)],'Visible','off');
      end

      alpha0=alpha1;
   end

elseif nargin == 2,
   % second and/or latter plotting, update line properties

   window=getaxis(handler(size(handler,1)));;

   % plots decision boundaries and the vectrost alphas
   j=1;
   alpha0=alphas(anum,:);
   for i=1:anum,

      % plots decision boundary between two classes determined by the alphas
      alpha1=alphas(i,:);
      alpha=alpha0-alpha1;
      alpha=[-alpha(2) alpha(1)];
      [x,y]=cliplin2(alpha,window);

      % clear old line
      set(handler(j),'Visible','off');
      % plot new one
      if sum(alpha1) == 0,
         set(handler(j),'XData',[0 x],'YData',[0 y]);
      else
         set(handler(j),'XData',[0 x],'YData',[0 y],'Visible','on');
      end
      j=j+1;


      % computes line of the vector alpha
      [x,y]=cliplin2(alpha1,window);

      % clear old line
      set(handler(j),'Visible','off');

      % plot new line
      if sum(alpha1) == 0,
         set(handler(j),'XData',[0 x],'YData',[0 y],'Color',color(index(i)));
      else
         set(handler(j),'XData',[0 x],'YData',[0 y],'Color',color(index(i)),'Visible','on');
      end
      j=j+1;

      alpha0=alpha1;
   end
end